Skip to content

Preserve aware datetime timezones in format_time - #68

Open
ShahadatTest wants to merge 1 commit into
wolph:developfrom
ShahadatTest:fix/format-time-preserve-timezone
Open

ShahadatTest wants to merge 1 commit into
wolph:developfrom
ShahadatTest:fix/format-time-preserve-timezone

Conversation

@ShahadatTest

Copy link
Copy Markdown
Contributor

format_time() converts an aware datetime to a Unix timestamp, then reconstructs it using the host's local timezone. This changes the displayed clock time and drops its UTC offset. The same input can therefore render differently on different hosts.

Pass the input datetime's timezone to fromtimestamp(), preserving the represented instant, its timezone and the existing precision truncation. Naive inputs continue to use local time. Tests cover UTC, positive and negative offsets, plus the naive behavior; add an aware-datetime doctest.

Three new timezone regressions fail before the fix and the naive control passes. Full Python 3.10 and 3.12 suites: 373 passed, 5 optional timezone-data skips, 100% branch/statement coverage. Whole-project mypy, basedpyright and Pyrefly report no errors. Ruff lint and formatting of changed files, plus git diff --check, pass. No matching open issue or PR found.

AI assistance: OpenAI Codex (GPT-6). Original user request: new 14ta koro aro (make 14 more new contributions). Diff inspection was automated; no human review or personal production usage is claimed.

@wolph

wolph commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Thank you for the pull request and the tests.

Showing the host's local time for an aware datetime does look odd, but every aware datetime has rendered that way so far: format_time(datetime(2000, 1, 2, 3, 4, 5, tzinfo=timezone.utc)) gives '2000-01-02 04:04:05' on a host in Amsterdam, and '2000-01-02 03:04:05+00:00' with this change. Anyone who logs, parses, stores or aligns those strings, for example from datetime.now(timezone.utc) or Django's timezone.now(), would get a different result from a minor release, and most people install python-utils without an upper bound. There's also a catch near datetime.max: with a positive offset, fromtimestamp raises an OverflowError, which the except (ValueError, OSError) doesn't catch.

I wouldn't oppose keeping the timezone, but I'd rather do it as an opt-in keyword argument, or with a DeprecationWarning for aware datetimes in 4.x and the new output in 5.0. Would you be up for changing the PR that way?

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants